import axios from 'axios'
import qs from 'qs'
import merge from 'lodash/merge'
import { Message } from 'element-ui'

// axios.defaults.baseURL = 'https://open.duyiedu.com'

axios.create({
  baseURL: window.INIT_CONFIG['baseUrl'],
  timeout: 1000 * 30,
  withCredentials: false,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  },
  // 默认情况下，axios将JavaScript对象序列化为JSON。 要以application / x-www-form-urlencoded格式发送数据，
  paramsSerializer: function (params) {
    return qs.stringify(params, { allowDots: true, indices: false })
  }
})

// 请求拦截器
axios.interceptors.request.use(
  (config) => {
    if (window.localStorage.getItem('token')) {
      config.headers['auth-token'] = window.localStorage.getItem('token')
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

axios.interceptors.response.use(
  (response) => {
    if (response.headers['auth-token']) {
      window.localStorage.setItem('token', response.headers['auth-token'])
    }
    return response
  },
  (error) => {
    if (error.response.status === 401) {
      // 设置跳转到登录页面吧
      // router.push({name : 'login'})
      // 有些应用需要多个权限的，可以设置不同token验证不能应用
      window.localStorage.removeItem('token')
      // 这里可以重置一下store的user属性
    }
    if (error.response.status === 403) {
      Message.error('没有权限')
    }
    if (error.response.status === 500) {
      Message.error('请求发生了错误')
    }
    return Promise.reject(error)
  }
)

axios.setUrl = (actionName, domain = 'baseUrl') => {
  return window.INIT_CONFIG[domain] + actionName
}

/**
 *
 * @param {*} params  参数对象
 * @param {*} openDefaultParams 是否开启默认参数
 */

axios.setParams = (params = {}, openDefaultParams = true) => {
  var defaults = {
    t: new Date().getTime()
  }
  return openDefaultParams ? merge(defaults, params) : params
}

/**
 * 处理post请求发送的数据对象。
 * @param {*} data  数据对象
 * @param {*} openDefaultData 是否开启默认数据
 * @param {*} contentType 数据格式
 * json: 'application/json; charset=utf-8'
 * form: 'application/x-www-form-urlencoded; charset=utf-8'
 * @returns
 */

axios.setData = (data = {}, openDefaultData = true, contentType = 'json') => {
  var defaults = {
    t: new Date().getTime()
  }
  data = openDefaultData ? merge(defaults, data) : data
  return contentType === 'json' ? JSON.stringify(data) : qs.stringify(data)
}

export default axios
